package com.vitalfit.utils;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.vitalfit.enums.FileType;
import com.vitalfit.model.vo.AliYunOssResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
import java.util.UUID;

@Component
@Slf4j
public class AliYunOSSUtil {
    @Value("${aliyunOss.endpoint}")
    private String endpoint;
    @Value("${aliyunOss.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyunOss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${aliyunOss.bucketName}")
    private String bucketName;
    @Value("${aliyunOss.urlPrefix}")
    private String urlPrefix;

    /**
     * 上传文件，以IO流方式
     *
     * @param inputStream 输入流
     * @param objectName   唯一objectName（在oss中的文件名字）
     */
    public AliYunOssResult upload(InputStream inputStream, String objectName) {
        AliYunOssResult aliyunOssResult = new AliYunOssResult();
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 上传内容到指定的存储空间（bucketName）并保存为指定的文件名称（objectName）。
            ossClient.putObject(bucketName, objectName, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            aliyunOssResult.setCode(200);
            aliyunOssResult.setUrl(urlPrefix+objectName);
            aliyunOssResult.setMsg("上传成功");
        } catch (Exception e) {
            log.error("OSS上传失败");
            aliyunOssResult.setCode(400);
            aliyunOssResult.setMsg("上传失败");
        }
        return aliyunOssResult;
    }

    public AliYunOssResult uploadFile(MultipartFile file, FileType fileType) {
        String suffix = Objects.requireNonNull
                (file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf(".") + 1);
        String objectName = fileType.getName().toLowerCase() + "/" + UUID.randomUUID() + "." + suffix;
        try {
            return this.upload(file.getInputStream(), objectName);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
